package com.gopay.scheduler.service.tyy.impl;

import com.gopay.common.constants.Constants;
import com.gopay.common.constants.holiday.HolidayType;
import com.gopay.common.constants.proccode.ProcCodeConstants;
import com.gopay.common.constants.trans.ProductType;
import com.gopay.common.constants.wallet.tyy.WaTyyProductConstants;
import com.gopay.common.cps.dao.wallet.tyy.WaTYYProductDao;
import com.gopay.common.domain.dps.WaTyyProduct;
import com.gopay.common.exception.GopayException;
import com.gopay.common.util.CalendarUtils;
import com.gopay.common.util.DateUtils;
import com.gopay.common.util.FastJsonUtil;
import com.gopay.remote.cps.holiday.HolidayRemoteService;
import com.gopay.scheduler.service.tyy.WaTyyCreateProductService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.math.BigDecimal;
import java.util.Date;

/**
 * @author byp
 * @date 2016年09月21日 下午6:46:00
 * www.gopay.com.cn Inc.All rights reserved.
 *
 * 此Service与钱包天溢赢产品定时生成,开始和关闭有关;
 *
 * 1,23:00点优先关闭当天标的
 * 2,再生成次日的标的
 *
 * 1,10点发售
 */
@Service("waTyyCronProductService")
public class WaTyyCreateProductServiceImpl implements WaTyyCreateProductService {
    private Logger logger = LoggerFactory.getLogger(this.getClass());
    @Resource(name = "waTYYProductDao")
    private WaTYYProductDao waTYYProductDao;
    @Resource(name = "holidayRemoteService")
    private HolidayRemoteService holidayRemoteService;
    private @Value("#{webProperties['waTyy.PeriodType']}") String periodType;
    private @Value("#{webProperties['waTyy.PeriodCounts']}") Integer periodCounts;
    private @Value("#{webProperties['waTyy.AnnualReturnRate']}") String annualReturnRate;
    private @Value("#{webProperties['waTyy.RealAnnualReturnRate']}") String realAnnualReturnRate;
    private @Value("#{webProperties['waTyy.AmtLimit']}") String amtLimit;
    private @Value("#{webProperties['waTyy.ProfitMethod']}") Integer profitMethod;
    private @Value("#{webProperties['waTyy.CorpCustName']}") String corpCustName;

    /**
     * 创建和关闭
     */
    @Override
    public void closeAndCreateProduct() {
        WaTyyProduct waTyyProduct = null;
        Date begin = CalendarUtils.getNextDate(new Date(), 1);
        //因为是23:00定时关闭,应优先关闭今天的标
        waTyyProduct = waTYYProductDao.getProductByProductTerm(DateUtils.format(new Date(), "yyyy-MM-dd"));
        try {
            if (waTyyProduct != null && !WaTyyProductConstants.ALREADY_CLOSED.getValue().equals(waTyyProduct.getStatus())) {
                logger.info("23:00:00 " + waTyyProduct.getProductId() + "更新钱包天溢赢状态为关闭===开始");
                waTyyProduct.setVersion(waTyyProduct.getVersion());
                waTyyProduct.setStatus(WaTyyProductConstants.ALREADY_CLOSED.getValue());
                waTYYProductDao.update(waTyyProduct);
                logger.info("23:00:00 " + waTyyProduct.getProductId() + "更新钱包天溢赢状态为关闭===结束");
            }
        } catch (Exception e) {
            logger.error("23:00:00 " + waTyyProduct.getProductId() + "更新钱包天溢赢状态为关闭========异常",e);
        }
        try {
            //节假日须在CONSOLE创建天溢赢特有节假日页面来管理tyyholiday
            if (holidayRemoteService.isWaTyyHoliday(begin, HolidayType.WA_TYY_HOLIDAY)) {
                logger.info("=================节假日不生成天溢赢标===================");
                return;
            }
            //之后判断是否已经生成过第二天的标
            waTyyProduct = waTYYProductDao.getProductByProductTerm(DateUtils.format(begin, "yyyy-MM-dd"));
            if (waTyyProduct != null && waTyyProduct.getStatus() != null) {
                logger.error("=================不再重复生成天溢赢产品=================");
                return;
            }
            logger.info("23:00:00 生成钱包天溢赢标的======开始");
            //若未生成第二天的标,则开始生成
            waTyyProduct = new WaTyyProduct();
            waTyyProduct.setProductName(DateUtils.format(begin, "yyyyMMdd"));
            waTyyProduct.setProductTerm(DateUtils.format(begin, "yyyy-MM-dd"));
            waTyyProduct.setProductType(ProductType._00001.getValue());
            waTyyProduct.setPeriodType(periodType);
            waTyyProduct.setPeriodCounts(periodCounts);
            waTyyProduct.setCorpCustName(corpCustName);
            waTyyProduct.setCorpCustId(Constants.GOPAY_SYS_MERID);
            waTyyProduct.setStatus(WaTyyProductConstants.UNSTART.getValue());
            //购买开始时间
            waTyyProduct.setPurchaseBeginTime(DateUtils.strToDate(DateUtils.format(begin, "yyyyMMdd") + "10", "yyyyMMddHH"));
            //购买结束时
            waTyyProduct.setPurchaseEndTime(DateUtils.strToDate(DateUtils.format(begin, "yyyyMMdd") + "23", "yyyyMMddHH"));
            //计息方式
            waTyyProduct.setProfitMethod("D+"+profitMethod);

            //计息时间
            waTyyProduct.setProfitDate(DateUtils.strToDate(DateUtils.format(CalendarUtils.getNextDate(new Date(),profitMethod+1), "yyyyMMdd"),"yyyyMMdd"));
            //到期时间
            waTyyProduct.setExpirationDate(DateUtils.strToDate(DateUtils.format(CalendarUtils.getNextDate(new Date(),periodCounts+profitMethod+1), "yyyyMMdd"),"yyyyMMdd"));
            //年化
            waTyyProduct.setAnnualReturnRate(new BigDecimal(annualReturnRate));
            waTyyProduct.setRealAnnualReturnRate(new BigDecimal(realAnnualReturnRate));
            //限额
            waTyyProduct.setAmtLimit(new BigDecimal(amtLimit));
            //可购买额度
            waTyyProduct.setAvaAmt(waTyyProduct.getAmtLimit());
            waTyyProduct.setCteateTime(new Date());
            waTyyProduct.setUnsettleAmt(new BigDecimal("0"));
            waTyyProduct.setPurchaseAmt(new BigDecimal("0"));
            // modify baiyunpeng 因2017年8月11日,天溢赢产品未生成,补全日志 start
            WaTyyProduct tyyProduct = waTYYProductDao.save(waTyyProduct);
            if (tyyProduct!=null) {
                logger.info("=================钱包天溢赢产品生成完成[{}]=================", FastJsonUtil.toJSONString(tyyProduct));
            } else {
                logger.info("钱包天溢赢产品生成=================异常=================.");
                throw new GopayException(ProcCodeConstants.PROC_CODE_100F1002,"钱包天溢赢产品生成=================异常=================");
            }
            // modify baiyunpeng 因2017年8月11日,天溢赢产品未生成,补全日志 end
        } catch (GopayException  e) {
            logger.error("钱包天溢赢产品生成=================异常=================",e);
        }
    }

    /**
     * 开始发售
     */
    @Override
    public void startSaleProduct() {
        try {
            WaTyyProduct waTyyProduct = waTYYProductDao.getProductByProductTerm(DateUtils.format(new Date(),"yyyy-MM-dd"));
            if(waTyyProduct!=null && WaTyyProductConstants.SALES_ING.getValue().equals(waTyyProduct.getStatus()) ){
                logger.error("10:00:00 钱包天溢赢状态不再更新");
                return;
            }
            if(waTyyProduct!=null && WaTyyProductConstants.UNSTART.getValue().equals(waTyyProduct.getStatus())){
                logger.info("10:00:00 更新钱包天溢赢状态=====on("+WaTyyProductConstants.SALES_ING+")==============开始");
                waTyyProduct.setVersion(waTyyProduct.getVersion());
                waTyyProduct.setStatus(WaTyyProductConstants.SALES_ING.getValue());
                waTYYProductDao.update(waTyyProduct);
                logger.info("10:00:00 更新钱包天溢赢状态=====on("+WaTyyProductConstants.SALES_ING+")==============结束");
            }else {
                logger.info("10:00:00 无钱包天溢赢标的,不更新");
                return;
            }
        } catch (Exception e) {
            logger.error("10:00:00 更新钱包天溢赢标状态=====on ,异常",e);
        }
    }
}
